/**
 * 日期格式化函数
 * @param date 日期对象
 * @param format 日期格式，默认为 YYYY-MM-DD HH:mm:ss
 */
export const formatDate = (date: Date, format = 'YYYY-MM-DD HH:mm:ss') => {
  // 获取年月日时分秒，通过 padStart 补 0
  const year = String(date.getFullYear())
  const month = String(date.getMonth() + 1).padStart(2, '0')
  const day = String(date.getDate()).padStart(2, '0')
  const hours = String(date.getHours()).padStart(2, '0')
  const minutes = String(date.getMinutes()).padStart(2, '0')
  const seconds = String(date.getSeconds()).padStart(2, '0')

  // 返回格式化后的结果
  return format
    .replace('YYYY', year)
    .replace('MM', month)
    .replace('DD', day)
    .replace('HH', hours)
    .replace('mm', minutes)
    .replace('ss', seconds)
}

/**
 * 防抖：在事件被触发n秒后再执行回调，如果在这n秒内又被触发，则重新计时。等待触发事件n秒内不再触发事件才执行。
 * @param {Function} func 要执行的回调函数
 * @param {Number} wait 延时的时间 默认500
 */
export function debounce(func: Function, wait = 500) {
  // 定义定时器变量
  let timeout = null
  // 清除定时器
  if (timeout !== null) clearTimeout(timeout)
  //设置定时器
  timeout = setTimeout(() => {
    typeof func === 'function' && func()
  }, wait)
}

/**
 * 节流：当持续触发事件时，保证一定时间段内只调用一次事件处理函数。
 * @param {Function} func 要执行的回调函数
 * @param {Number} wait 延时的时间
 */
export function throttle(func: Function, wait = 500) {
  // 定义定时器变量
  let timer = null
  // 存在定时器，则不处理
  if (timer) return
  //设置定时器
  timer = setTimeout(() => {
    typeof func === 'function' && func()
    timer = null
  }, wait)
}
